package service;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import util.UtilData;
import dao.GenericDAO;
import dao.OrcamentoDAO;
import dao.ParcelaTransacaoDAO;
import entity.CategoriaTransacao;
import entity.Orcamento;
import entity.ParcelaTransacao;

@Service
public class OrcamentoServiceImpl extends ManutencaoServiceImpl<Orcamento>
	implements OrcamentoService, Serializable {

    private static final long serialVersionUID = 2892712219712130868L;

    @Autowired
    private OrcamentoDAO orcamentoDAO;

    @Autowired
    private CategoriaTransacaoService categoriaTransacaoService;

    @Autowired
    private ParcelaTransacaoDAO parcelaTransacaoDAO;

    @Override
    public GenericDAO<Orcamento> getDAO() {
	return orcamentoDAO;
    }

    @Override
    public Orcamento criarOrcamento() {

	final Orcamento orcamento = new Orcamento();
	orcamento.setCategoriaTransacao(new CategoriaTransacao());
	orcamento.setValor(BigDecimal.ZERO);
	orcamento.setValorUsado(BigDecimal.ZERO);

	final Calendar calendar = Calendar.getInstance();
	
	orcamento.setDataInicial(calendar.getTime());

	calendar.add(Calendar.MONTH, 1);

	orcamento.setDataFinal(calendar.getTime());

	return orcamento;
    }

    @Override
    public List<Orcamento> listarOrcamentosDoPeriodoAtual() {

	final List<Orcamento> listaOrcamentos = orcamentoDAO
		.listarOrcamentosNaData(UtilData.getDataAtual());

	for (Orcamento orca : listaOrcamentos) {
	    final List<ParcelaTransacao> listaParcelas = parcelaTransacaoDAO
		    .listarParcelasPorPeriodoECategoria(orca.getDataInicial(),
			    orca.getDataFinal(), orca.getCategoriaTransacao(),
			    true);

	    orca.setValorUsado(BigDecimal.ZERO);
	    for (ParcelaTransacao parc : listaParcelas) {
		orca.setValorUsado(orca.getValorUsado().add(parc.getValor()));
	    }

	    orca.setPercentUsado(orca.getValorUsado()
		    .multiply(BigDecimal.valueOf(100))
		    .divideToIntegralValue(orca.getValor()));

	}

	return listaOrcamentos;
    }

}
